home *** CD-ROM | disk | FTP | other *** search
- %Item
- %Text
- 2 Optmierer
- 1
- 1 In diesem Abschnitt wird kurz erläutert, wie
- 1der Optimierer arbeitet. Es ist ein einfacher
- 1Peephole-Optimizer, der keine Analysen über
- 1den Code fährt und dann den generierten Code
- 1verbessert, sondern er schaut nach kurzen Se-
- 1quenzen im Code, die dann durch kürzere oder
- 1schnellere ersetzt werden. Dies macht deshalb
- 1Sinn, weil der Compiler Code jeweils unabhän-
- 1gig in Blöcken generiert. Da wären z.B :
- 1
- 1 - Variablenadressierung
- 1 - Befehlsfolgen
- 1 - Prozeduraufrufe
- 1 - Ausdrücke
- 1
- 1um nur einige zu nennen. Schauen wir uns mal
- 1ein kurzes Mini-Comp-Programm an :
- 1
- 3 Program Test;
- 3 Var i : Integer;
- 3
- 3 Begin
- 3 Writeln('Hallo Welt');
- 3 Readln(i);
- 3 Writeln('I=',i)
- 3 End.
- 3
- 1Welche Blöcke werden nun im Code erzeugt ?
- 1
- 1 <Push 'Hallo Welt'> ; String auf den Stack
- 1 <Put String> ; String ausgeben
- 1 <Read Wort> ; Wort von StdIO lesen
- 1 <Make Int> ; Eingabe nach Integer
- 1 <Push Adr(I)> ; Adresse i auf Stack
- 1 <Assign> ; Intwert nach Adresse
- 1 ; speichern
- 1 <Push 'I='> ; String auf Stack
- 1 <Put String> ; String ausgeben
- 1 <Push adr(i)> ; Adresse von i und
- 1 <Fetch> ; Inhalt auf den Stack
- 1 <Make String> ; In String wandeln
- 1 <Put String> ; und ausgeben
- 1
- 1 Und alle diese Blöcke werden unabhängig von
- 1einander erzeugt, so daß an aufeinander fol-
- 1genden Blöcken Optimierungen möglich sind.
- 1
- 1 Folgende Sequenzen werden im Moment erkannt
- 1und optimiert :
- 1
- 3 Alt Optimiert
- 1
- 1 Move.l #x,d0 Moveq #x,d0
- 1
- 1 Move.l a5,a0
- 1 Move.l (a0),a0 Move.l (a5),a0
- 1
- 1 Move.l d0,-(sp)
- 1 Move.l (sp)+,d0 --
- 1
- 1 Move.l a0,-(sp)
- 1 Move.l (sp)+,a0 --
- 1
- 1 Adda.l #0,a0 --
- 1
- 1 Addi.l #0,(a7) --
- 1
- 1 Move.w d0,-(sp)
- 1 Move.w (sp)+,d0 --
- 1
- 1 Wobei <x> im Bereich von -128 bis +127 lie-
- 1gen muß.
- %Ende
-